import 'reflect-metadata'
import { PipeTransform } from './pipe-transform.interface' // 所有的管道都需要实现 PipeTransform 接口

/**
 * 使用管道的装饰器
 * 返回的可能是一个类装饰器或方法装饰器
 */
export function UsePipes(...pipes: PipeTransform[]) {
  /**
   * 如果是类装饰器则只有1个参数: 类本身
   * 如果是方法装饰器则拥有3个参数: 类的原型对象 被装饰的方法名 属性描述符
   */
  return (target: object | Function, property?: string, descriptor?: PropertyDescriptor ) => {
    if (descriptor) { // 方法装饰器
      Reflect.defineMetadata('pipes', pipes, descriptor.value) // 给方法添加一个 pipes 元数据 值是管道组成的数组
    } else { // 类装饰器
      Reflect.defineMetadata('pipes', pipes, target) // 给控制器类添加一个 pipes 元数据 值是管道组成的数组
    }
  }
}

